home *** CD-ROM | disk | FTP | other *** search
- ;
- ; screen handling primitives
- ;
- ; by: jim nutt
- ;
-
- .model large
-
- .data
-
- vseg dw 0b000h
- vmode db ?
- x dw 0
- y dw 0
- color db 07h
- ofs dw 0
- xhite db 8
-
- ; video information block
-
- VIOinfo struc
- level db ?
- db ?
- dw ?
- flags dw ?
- mode db ?
- db ?
- colors dw ?
- pixcol dw ?
- pixrow dw ?
- txtcol dw ?
- txtrow dw ?
- VIOinfo ends
-
- info VIOinfo <0,0,14,1,0,0,2,0,0,80,25>
-
- .code
-
- public _VIOopen, _VIOclose, _VIOcolumns, _VIOrows, _VIOmode
- public _VIOscrollright, _VIOscrollleft, _VIOscrollup, _VIOscrolldown
- public _VIOclear, _VIOputc, _VIOputs, _VIOgetca, _VIOgetra, _VIOheight,
- public _VIOsetfore, _VIOsetback, _VIOgetfore, _VIOgetback
- public _VIOgotoxy, _VIOupdate, _VIOwherex, _VIOwherey, _VIOputr
- public _VIOcursor, _VIOsegment, _VIOsetSegment, _VIOsetRows, _VIOsetCols
-
- ;int _far _pascal VIOheight(void)
-
- _VIOheight proc
-
- mov al, xhite;
- xor ah,ah;
- ret
-
- _VIOheight endp
-
- ;int _far _pascal VIOopen(void);
-
- _VIOopen proc
-
- push ds
-
- mov ax,3000h ; get dos version, v4 can do this from dos
- int 21h
-
- cmp al,4
- jge odos4
-
- mov ax,0f00h ; get screen mode and width
- int 10h
-
- mov vmode, al
-
- cmp al,7
- je mono
-
- xor al,al
- xchg al,ah
- mov info.txtcol,ax
- mov vseg,0b800h
-
- push di
- mov ax,0fe00h
- mov es,vseg
- mov di,0
- int 10h
- pop di
- mov vseg,es
-
- push bp ; how many rows
- mov ax,1130h
- mov bh,1h
- xor dx,dx
- int 10h
- pop bp
-
- cmp dl,0
- je cga
-
- mov xhite,cl
- inc dl
- xor dh,dh
- mov info.txtrow,dx
-
- mono: mov ax,0
- pop ds
- ret
-
- odos4: mov ax,440ch
- mov bx,0
- mov cx,037fh
- mov dx,offset info
- int 21h
- jnc l1
- pop ds
- ret
-
- cga: mov info.txtrow,25
-
- l1: mov ax,0
- pop ds
- ret
-
- _VIOopen endp
-
- ;void _far _pascal VIOclose(void);
-
- _VIOclose proc
-
- mov ax,3000h
- int 21h
-
- cmp al,4
- jl l2
-
- mov ax,440ch
- mov bx,0
- mov cx,035fh
- mov dx,offset info
- int 21h
-
- l2: ret
-
- _VIOclose endp
-
- ;int _far VIOcolumns(void);
-
- _VIOcolumns proc
-
- mov ax,info.txtcol
- ret
-
- _VIOcolumns endp
-
- ;int _far VIOrows(void);
-
- _VIOrows proc
-
- mov ax,info.txtrow
- ret
-
- _VIOrows endp
-
- ;int _far VIOmode(void);
-
- _VIOmode proc
-
- mov al,vmode
- xor ah,ah
- ret
-
- _VIOmode endp
-
- ;int _far VIOwherex(void);
-
- _VIOwherex proc
-
- mov ax,x
- ret
-
- _VIOwherex endp
-
- ;int _far VIOwherey(void);
-
- _VIOwherey proc
-
- mov ax,y
- ret
-
- _VIOwherey endp
-
- ;void _far VIOscrollright(int x1, int y1, int x2, int y2, int count);
-
- _VIOscrollright proc
-
- push bp
- mov bp,sp
- pushf
-
- std
-
- push di
- push si
-
- mov ax,[bp+8]
- mov bx,[bp+12]
- sub bx,ax
- mov cx,info.txtcol
- mul cl
- mov dx,[bp+10]
- add dx,ax
- shl dx,1
- mov cx,[bp+10]
- sub cx,[bp+6]
-
- add bx,2
- mov [bp+6],cx
- mov [bp+8],bx
-
- mov es,vseg
-
- sr1: dec word ptr [bp+8]
- jz sr3
- mov bx,[bp+14]
-
- push ds
- mov ah,color
- mov al,20h
-
- push es
- pop ds
-
- sr2: mov di,dx
- mov si,di
- dec si
- dec si
- mov cx,[bp+6]
- rep movsw
- stosw
- dec bx
- jnz sr2
-
- pop ds
- mov ax,info.txtcol
- shl ax,1
- add dx,ax
- jmp sr1
-
- sr3: pop si
- pop di
-
- popf
- pop bp
- ret
-
- _VIOscrollright endp
-
- ;void _far VIOscrollleft(int x1, int y1, int x2, int y2, int count);
-
- _VIOscrollleft proc
-
- push bp
- mov bp,sp
- pushf
-
- push di
- push si
-
- mov ax,[bp+8]
- mov bx,[bp+12]
- sub bx,ax
- mov cx,info.txtcol
- mul cl
- mov dx,[bp+6]
- add dx,ax
- shl dx,1
- mov cx,[bp+10]
- sub cx,[bp+6]
-
- add bx,2
- mov [bp+6],cx
- mov [bp+8],bx
-
- mov es,vseg
-
- sl1: dec word ptr [bp+8]
- jz sl3
- mov bx,[bp+14]
-
- push ds
- mov ah,color
- mov al,20h
-
- push es
- pop ds
-
- sl2: mov di,dx
- mov si,di
- inc si
- inc si
- mov cx,[bp+6]
- rep movsw
- stosw
- dec bx
- jnz sl2
-
- pop ds
- mov ax,info.txtcol
- shl ax,1
- add dx,ax
- jmp sl1
-
- sl3: pop si
- pop di
-
- popf
- pop bp
- ret
-
- _VIOscrollleft endp
-
- ;void _far VIOscrollup(int x1, int y1, int x2, int y2, int count);
-
- _VIOscrollup proc
-
- push bp
- mov bp,sp
- push di
- push si
-
- mov es,vseg
-
- mov bx,[bp+6]
- mov ax,[bp+8]
- mov dx,info.txtcol
- mul dl
- add ax,bx
- shl ax,1
- shl dx,1
-
- push ax
- push ds
- push ax
-
- mov cx,[bp+10]
- sub cx,bx
- mov bx,cx
-
- mov ax,[bp+12]
- sub ax,[bp+8]
- mov [bp+12],ax
-
- push es
- pop ds
- inc word ptr [bp+14]
-
- l9: dec word ptr [bp+14]
- jz l11
- mov ax,[bp+12]
-
- l10: pop di
- mov si,di
- add si,dx
- push si
- mov cx,bx
- rep movsw
- dec ax
- jne l10
-
- pop di
- pop ds
- mov al,20h
- mov ah,color
- mov cx,bx
- rep stosw
-
- pop di
- push di
- push ds
- push di
-
- push es
- pop ds
- jmp l9
-
- l11: pop ax
- pop ds
- pop ax
- pop si
- pop di
-
- pop bp
- ret
-
- _VIOscrollup endp
-
- ;void _far VIOscrolldown(int x1, int y1, int x2, int y2, int count);
-
- _VIOscrolldown proc
-
- push bp
- mov bp,sp
- push di
- push si
-
- mov es,vseg
-
- mov bx,[bp+6]
- mov ax,[bp+12]
- mov dx,info.txtcol
- mul dl
- add ax,bx
- shl ax,1
- shl dx,1
-
- push ax
- push ds
- push ax
-
- mov cx,[bp+10]
- sub cx,bx
- mov bx,cx
-
- mov ax,[bp+12]
- sub ax,[bp+8]
- mov [bp+12],ax
-
- push es
- pop ds
- inc word ptr [bp+14]
-
- l6: dec word ptr [bp+14]
- jz l7
- mov ax,[bp+12]
-
- l8: pop di
- mov si,di
- sub si,dx
- push si
- mov cx,bx
- rep movsw
- dec ax
- jne l8
-
- pop di
- pop ds
- mov al,20h
- mov ah,color
- mov cx,bx
- rep stosw
-
- pop di
- push di
- push ds
- push di
-
- push es
- pop ds
- jmp l6
-
- l7: pop ax
- pop ds
- pop ax
- pop si
- pop di
- pop bp
- ret
-
- _VIOscrolldown endp
-
- ;void _far VIOclear(int x1, int y1, int x2, int y2);
-
- _VIOclear proc
-
- push bp
- mov bp,sp
- push di
- push si
-
- mov es,vseg
-
- mov ax,[bp+8]
- mov bx,[bp+6]
- mov cx,info.txtcol
- mul cl
- add ax,bx
- shl ax,1
- mov si,ax
- mov bx,[bp+10]
- sub bx,[bp+6]
- inc bx
- mov dx,[bp+12]
- sub dx,[bp+8]
- inc dx
- mov al,20h
- mov ah,color
-
- l5: mov di,si
- mov cx,bx
- rep stosw
- mov cx,info.txtcol
- shl cx,1
- add si,cx
- dec dx
- jne l5
-
- pop si
- pop di
- pop bp
- ret
-
- _VIOclear endp
-
- ;void _far VIOputc(const char c);
-
- _VIOputc proc
-
- push bp
- mov bp,sp
- push di
-
- mov es,vseg
- mov di,ofs
-
- mov ax,[bp+6]
- mov ah,color
-
- stosw
-
- mov ofs,di
- pop di
-
- mov ax,x
- inc ax
- cmp ax,info.txtcol
- jge cwrap
-
- mov x,ax
-
- pop bp
- ret
-
- cwrap: inc y
- sub ax,info.txtcol
- mov x,ax
-
- pop bp
- ret
-
- _VIOputc endp
-
- ;void _far VIOputs(const char far * s);
-
- _VIOputs proc
-
- push bp
- mov bp,sp
- push di
- push si
- push ds
-
- mov es,vseg
- mov di,ofs
-
- mov ah,color
- lds si,[bp+6]
- mov bx,x
-
- l3: lodsb
- cmp al,0
- je l4
- stosw
- inc bx
-
- jmp l3
-
- l4: mov ofs,di
- pop ds
- pop si
- pop di
-
- cmp bx,info.txtcol
- jge swrap
-
- mov x,bx
-
- pop bp
- ret
-
- swrap: inc y
- sub bx,info.txtcol
- mov x,bx
-
- pop bp
- ret
-
- _VIOputs endp
-
- ;int _far VIOgetca(const int x, const int y);
-
- _VIOgetca proc
-
- push bp
- mov bp,sp
-
- mov es,vseg
- mov ax,[bp+8]
- mov bx,[bp+6]
- mov cx,info.txtcol
- mul cl
- add ax,bx
- shl ax,1
-
- xchg ax,bx
- mov ax,es:[bx]
-
- pop bp
- ret
-
- _VIOgetca endp
-
- ;int *_far VIOgetra(int x1, int y1, int x2, int y2, int * b);
-
- _VIOgetra proc
-
- push bp
- mov bp,sp
- push di
- push si
- push ds
-
- mov ax,[bp+8] ; y1
- mov bx,info.txtcol
- mul bl ; y1 * width of screen
- add ax,[bp+6]
- shl ax,1 ; x1 * 2
- shl bx,1 ; width * 2
- mov cx,[bp+10]
- sub cx,[bp+6] ; x2 - x1
- mov dx,[bp+12]
- sub dx,[bp+8] ; y2 - y1
- inc dx
- inc cx
- les di,[bp+14]
- mov ds,vseg
- push cx
-
- gr1: pop cx
- push cx
- mov si,ax
- rep movsw
- add ax,bx
- dec dx
- jnz gr1
-
- pop cx
-
- pop ds
- pop si
- pop di
- pop bp
- ret
-
- _VIOgetra endp
-
- ;void _far VIOputr(int x, int y, int w, int h, int far * b);
-
- _VIOputr proc
-
- push bp
- mov bp,sp
-
- push ds
- push si
- push di
-
- mov ax,[bp+8]
- mov bx,info.txtcol
- mul bl ; y * width
- add ax,[bp+6]
- shl ax,1
- shl bx,1
-
- mov es,vseg
-
- lds si,[bp+14]
- mov dx,[bp+10]
-
- pr1: mov cx,dx
- mov di,ax
- rep movsw
- add ax,bx
- dec word ptr [bp+12]
- jnz pr1
-
- pop di
- pop si
- pop ds
-
- pop bp
- ret
-
- _VIOputr endp
-
- ;void _far VIOsetfore(const int c);
-
- _VIOsetfore proc
-
- push bp
- mov bp,sp
-
- mov bl,color
- and bx,00f0h
- mov ax,[bp+6]
- and ax,000fh
- or ax,bx
- mov color,al
-
- pop bp
- ret
-
- _VIOsetfore endp
-
- ;void _far VIOsetback(const int c);
-
- _VIOsetback proc
-
- push bp
- mov bp,sp
-
- mov bl,color
- and bx,000fh
- mov ax,[bp+6]
- and ax,000fh
- shl ax,1
- shl ax,1
- shl ax,1
- shl ax,1
- or ax,bx
- mov color,al
-
- pop bp
- ret
-
- _VIOsetback endp
-
- ;int _far VIOgetfore(void);
-
- _VIOgetfore proc
-
- mov al,color
- and ax,000fh
- ret
-
- _VIOgetfore endp
-
- ;int _far VIOgetback(void);
-
- _VIOgetback proc
-
- mov al,color
- and ax,00f0h
- shr al,1
- shr al,1
- shr al,1
- shr al,1
- ret
-
- _VIOgetback endp
-
- ;void _far VIOgotoxy(int x, int y);
-
- _VIOgotoxy proc
-
- push bp
- mov bp,sp
-
- mov bx,[bp + 6]
- mov ax,[bp + 8]
-
- mov x,bx
- mov y,ax
-
- mov cx,info.txtcol
- mul cl
-
- add ax,bx
- shl ax,1
-
- mov ofs,ax
-
- pop bp
- ret
-
- _VIOgotoxy endp
-
- ;void _far VIOupdate(int x1, int y1, int x2, int y2);
-
- _VIOupdate proc
-
- mov ah,2
- mov bh,0
- mov cx,y
- mov dx,x
- mov dh,cl
- int 10h
-
- ret
-
- _VIOupdate endp
-
- ;void _far VIOcursor(int _far * x, int _far * y, int _far * shape);
-
- _VIOcursor proc
-
- push bp
- mov bp,sp
- push ds
-
- mov ah,3
- mov bh,0
- int 10h
-
- mov al,dl
- cbw
- lds bx,[bp + 6]
- mov [bx],ax
-
- mov al,dh
- cbw
- lds bx,[bp + 10]
- mov [bx],ax
-
- lds bx,[bp + 14]
- mov [bx],cx
-
- pop ds
- pop bp
- ret
-
- _VIOcursor endp
-
- ;unsigned int _far VIOsegment(void);
-
- _VIOsegment proc
-
- mov ax, vseg
- ret
-
- _VIOsegment endp
-
- ;void _far VIOsetSegment(unsigned int s);
-
- _VIOsetSegment proc
-
- push bp
- mov bp,sp
-
- mov ax, [bp + 6]
- mov vseg,ax
-
- pop bp
- ret
-
- _VIOsetSegment endp
-
- ;void _far VIOsetRows(int r);
-
- _VIOsetRows proc
-
- push bp
- mov bp,sp
-
- mov ax,[bp + 6]
- mov info.txtrow,ax
-
- pop bp
- ret
-
- _VIOsetRows endp
-
- ;void _far VIOsetCols(int c);
-
- _VIOsetCols proc
-
- push bp
- mov bp,sp
-
- mov ax,[bp + 6]
- mov info.txtcol, ax
-
- pop bp
- ret
-
- _VIOsetCols endp
-
- end
-